<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const arr = [1, 2, 3, 4, 5];
        console.log("原数组: ", arr);
        
        // 数组中的重要方法
        // 1. 添加
        // push() 末尾添加
        // unshift() 头部添加
        // splice() 指定位置添加
        arr.push(6);
        console.log("push() 后的数组: ", arr);
        
        arr.unshift(0);
        console.log("unshift() 后的数组: ", arr); 
        arr.splice(3, 0, 3.5); // 在 index 为 3 的位置, 先删除 0 个元素, 再添加 3.5
        console.log("splice() 后的数组: ", arr);


        // 2. 删除
        // pop() 末尾删除
        // shift() 头部删除
        // splice() 指定位置删除 
        arr.pop();
        console.log("pop() 后的数组: ", arr);
        arr.shift();
        console.log("shift() 后的数组: ", arr);
        arr.splice(3, 1); // 在 index 为 3 的位置, 删除 1 个元素
        console.log("splice() 后的数组: ", arr);

        // 3. 包含
        // includes() 判断数组中是否包含某个元素
        console.log(arr.includes(3.5)); // true
        console.log(arr.includes(3.6)); // false

        // 4. 遍历
        // forEach() 遍历数组
        // 有三个参数: item, index, arr, Item 是当前遍历的元素, index 是当前遍历的索引, arr 是当前遍历的数组
        arr.forEach((item, index) => {
            console.log(`\nindex: ${index}, item: ${item}`);
        });

        // 5. 过滤
        // filter() 过滤数组
        // 有三个参数: item, index, arr, Item 是当前遍历的元素, index 是当前遍历的索引, arr 是当前遍历的数组
        let newArr = arr.filter((item, index) => {
            return item > 3;
        });
        console.log("filter() 后的数组: ", newArr);

        // 6. 映射
        // map() 映射数组, 返回一个新数组
        // 有三个参数: item, index, arr, Item 是当前遍历的元素, index 是当前遍历的索引, arr 是当前遍历的数组
        let mapArr = arr.map((item, index) => {
            return item * 2;
        });
        console.log("map() 后的数组: ", mapArr);
        let objArr = arr.map((item,index) => [{index, item}]);
        console.log("map() 后的数组对象: ", objArr);

        // 7. 检测
        // every() 检测数组中的每个元素是否都符合条件
        // 例如: 检测元素是否都是奇数
        let isOdd = arr.every((item, index) => {
            /* 
             1、如果返回true, 说明当前元素满⾜条件, 则继续检测下⼀次;
                若都满⾜条件, 则最终返回true
             2、如果返回false, 说明当前元素不满⾜条件;
                ⽴即停⽌检测, 最终返回false 
            */
            return item % 2 === 1;
        });

        // 8. 汇总
        // reduce() 汇总数组, 使用场景: 求和, 求积, 求最大值, 求最小值
        // 有四个参数: pre, item, index, arr, pre 是上一次的返回值, item 是当前遍历的元素, index 是当前遍历的索引, arr 是当前遍历的数组
        let sum = arr.reduce((pre, item, index) => {
            return pre + item;
        }, 0);
        console.log("reduce() 求知: ", sum);

        // 使用js中的最小值定义
        let min = arr.reduce((pre, item, index) => {
            return pre < item ? pre : item;
        }, Number.MAX_VALUE);
        let max = arr.reduce((pre, item, index) => {
            return pre > item ? pre : item;
        }, Number.MIN_VALUE);
        console.log("reduce() 求最小值: ", min);
        console.log("reduce() 求最大值: ", max);


    </script>
</body>
</html>